RANGER-5655: Dynamic unified ingestor registry for audit partition routing and service allowlists#1032
Open
ramackri wants to merge 10 commits into
Open
RANGER-5655: Dynamic unified ingestor registry for audit partition routing and service allowlists#1032ramackri wants to merge 10 commits into
ramackri wants to merge 10 commits into
Conversation
…gestor: runtime Kafka partition routing and per-repo service allowlists via compacted topic + REST, without ingestor restarts. Feature flag default off. Co-authored-by: Cursor <cursoragent@cursor.com>
Use hdfs-only allowlist for dev_hdfs, remove unused dev_solr allowlist entry, fix buffer partition example math, and add detailed manual test documentation for PR apache#1032. Co-authored-by: Cursor <cursoragent@cursor.com>
Keep dev_solr service allowlist property (remove only the stray blank line the feature commit added). Retain hdfs-only dev_hdfs allowlist and buffer partition example fix. Remove dev-support/RANGER-5655-PR-TEMPLATE.md. Co-authored-by: Cursor <cursoragent@cursor.com>
Correct import order, remove unused import, use static requireNonNull, drop duplicate test import, and align PartitionPlan imports with checkstyle rules reported on PR apache#1032. Co-authored-by: Cursor <cursoragent@cursor.com>
…n layout. Ship the standard 14-plugin lab list in ranger-audit-ingestor-site.xml with dynamic partition plan disabled by default; update buffer partition example to 14 × 3 + 9 = 51 total. Co-authored-by: Cursor <cursoragent@cursor.com>
Consolidate partition-plan mutations into three endpoints: GET plan, POST onboard plugin (mandatory non-empty services map), and PATCH update plugin. Remove PATCH /partition-plan and POST /services. Add validator and E2E coverage for mandatory services on onboard. Co-authored-by: Cursor <cursoragent@cursor.com>
Keep REST simplification to Java sources and unit tests only. Co-authored-by: Cursor <cursoragent@cursor.com>
Drop unused PromotePlugin, OnboardService, PluginScale, and PartitionPlanReplacement after REST API consolidation. Cache partition-plan admin users and dynamic.enabled flag in PartitionPlanService constructor.
Refactor partition-plan helpers and AuditREST partition-plan paths to match Ranger review style with one return statement per method.
Contributor
There was a problem hiding this comment.
Pull request overview
This PR implements the “dynamic unified ingestor registry” for audit-ingestor by introducing a Kafka-compacted, versioned partition-plan document (including per-repo service allowlists) and a simplified REST control plane to onboard/update plugins at runtime without restarting ingestor pods.
Changes:
- Adds Kafka-backed partition-plan registry plumbing (bootstrap, watcher, validator, update applier, registry client) with in-memory hot-path state via
PartitionPlanHolder. - Simplifies/introduces partition-plan REST endpoints in
AuditRESTforGET /partition-plan,POST /partition-plan/plugins, andPATCH /partition-plan/plugins/{pluginId}with request validation. - Introduces dynamic-mode allowlist behavior (registry-first with XML fallback) and composes
auth_to_localrules from the global allowlist union when dynamic mode is enabled.
Reviewed changes
Copilot reviewed 50 out of 50 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| audit-server/audit-ingestor/src/test/java/org/apache/ranger/audit/producer/kafka/partition/ServiceAllowlistResolverTest.java | Unit tests for registry-first allowlist resolution with XML fallback. |
| audit-server/audit-ingestor/src/test/java/org/apache/ranger/audit/producer/kafka/partition/ServiceAllowlistBootstrapTest.java | Unit tests for loading/merging allowlists from XML properties into plan services. |
| audit-server/audit-ingestor/src/test/java/org/apache/ranger/audit/producer/kafka/partition/PartitionPlanValidatorTest.java | Unit tests for plan shape validation and append-only constraints. |
| audit-server/audit-ingestor/src/test/java/org/apache/ranger/audit/producer/kafka/partition/PartitionPlanUpdateApplierTest.java | Unit tests for applying compacted Kafka plan records into memory. |
| audit-server/audit-ingestor/src/test/java/org/apache/ranger/audit/producer/kafka/partition/PartitionPlanServiceTest.java | Unit tests for dynamic-enabled flag and in-memory plan reads. |
| audit-server/audit-ingestor/src/test/java/org/apache/ranger/audit/producer/kafka/partition/PartitionPlanServiceMutationTest.java | Unit tests for onboard/update flows, optimistic locking, and topic-grow failure handling. |
| audit-server/audit-ingestor/src/test/java/org/apache/ranger/audit/producer/kafka/partition/PartitionPlanRequestValidatorTest.java | Unit tests for REST request model validation (mandatory services on onboard). |
| audit-server/audit-ingestor/src/test/java/org/apache/ranger/audit/producer/kafka/partition/PartitionPlanKafkaConfigTest.java | Unit tests for plan-topic config resolution and dynamic flag parsing. |
| audit-server/audit-ingestor/src/test/java/org/apache/ranger/audit/producer/kafka/partition/PartitionPlanHolderTest.java | Unit tests for plan holder allowlist access and install validation. |
| audit-server/audit-ingestor/src/test/java/org/apache/ranger/audit/producer/kafka/partition/PartitionPlanBootstrapTest.java | Unit tests for bootstrap plan layout and overrides. |
| audit-server/audit-ingestor/src/test/java/org/apache/ranger/audit/producer/kafka/partition/PartitionPlanBootstrapSupportTest.java | Unit tests for empty-registry bootstrap and peer-publish adoption. |
| audit-server/audit-ingestor/src/test/java/org/apache/ranger/audit/producer/kafka/partition/PartitionPlanAllocatorTest.java | Unit tests for onboard/update allocation behavior and service ownership rules. |
| audit-server/audit-ingestor/src/test/java/org/apache/ranger/audit/producer/kafka/partition/model/PartitionPlanJsonTest.java | Unit tests for JSON round-trip and semantic equality. |
| audit-server/audit-ingestor/src/test/java/org/apache/ranger/audit/producer/kafka/partition/AuthToLocalRuleComposerTest.java | Unit tests for composing/applying auth_to_local rules based on allowlists and dynamic mode. |
| audit-server/audit-ingestor/src/test/java/org/apache/ranger/audit/producer/kafka/AuditPartitionerDynamicTest.java | Unit tests for dynamic partition routing behavior and concurrency. |
| audit-server/audit-ingestor/src/main/resources/conf/ranger-audit-ingestor-site.xml | Updates config docs and adds dynamic partition-plan properties. |
| audit-server/audit-ingestor/src/main/java/org/apache/ranger/audit/server/AuditServerConfig.java | Allows overriding ingestor config path via -Daudit.config. |
| audit-server/audit-ingestor/src/main/java/org/apache/ranger/audit/rest/AuditREST.java | Adds simplified partition-plan REST endpoints and integrates dynamic allowlist enforcement. |
| audit-server/audit-ingestor/src/main/java/org/apache/ranger/audit/producer/kafka/partition/ServiceAllowlistResolver.java | Implements registry-first per-repo allowlist authorization with XML fallback. |
| audit-server/audit-ingestor/src/main/java/org/apache/ranger/audit/producer/kafka/partition/ServiceAllowlistBootstrap.java | Loads allowlists from XML properties and merges into plans when services are missing. |
| audit-server/audit-ingestor/src/main/java/org/apache/ranger/audit/producer/kafka/partition/PrimaryCatalogRule.java | Holds parsed auth_to_local catalog rules and mapped short names. |
| audit-server/audit-ingestor/src/main/java/org/apache/ranger/audit/producer/kafka/partition/PartitionPlanWatcher.java | Background watcher that bootstraps and refreshes in-memory plan from Kafka. |
| audit-server/audit-ingestor/src/main/java/org/apache/ranger/audit/producer/kafka/partition/PartitionPlanValidator.java | Validates plan structure, services, and append-only update semantics. |
| audit-server/audit-ingestor/src/main/java/org/apache/ranger/audit/producer/kafka/partition/PartitionPlanUpdateApplier.java | Applies newer plan versions from compacted Kafka records into PartitionPlanHolder. |
| audit-server/audit-ingestor/src/main/java/org/apache/ranger/audit/producer/kafka/partition/PartitionPlanService.java | Service layer for REST reads/mutations with optimistic locking and topic growth. |
| audit-server/audit-ingestor/src/main/java/org/apache/ranger/audit/producer/kafka/partition/PartitionPlanRequestValidator.java | Validates OnboardPlugin / UpdatePlugin request bodies. |
| audit-server/audit-ingestor/src/main/java/org/apache/ranger/audit/producer/kafka/partition/PartitionPlanRegistryFactory.java | Factory for opening Kafka-backed plan registries for REST mutations. |
| audit-server/audit-ingestor/src/main/java/org/apache/ranger/audit/producer/kafka/partition/PartitionPlanRegistry.java | Interface for durable partition-plan storage (Kafka compacted topic). |
| audit-server/audit-ingestor/src/main/java/org/apache/ranger/audit/producer/kafka/partition/PartitionPlanKafkaConfig.java | Centralizes partition-plan Kafka config resolution and security settings. |
| audit-server/audit-ingestor/src/main/java/org/apache/ranger/audit/producer/kafka/partition/PartitionPlanHolder.java | Atomic in-memory plan holder used by hot-path routing and allowlist resolution. |
| audit-server/audit-ingestor/src/main/java/org/apache/ranger/audit/producer/kafka/partition/PartitionPlanBootstrapConfig.java | Represents bootstrap inputs derived from legacy producer/XML config. |
| audit-server/audit-ingestor/src/main/java/org/apache/ranger/audit/producer/kafka/partition/PartitionPlanBootstrap.java | Bootstraps v1 plan from legacy config and seeds Kafka registry when empty. |
| audit-server/audit-ingestor/src/main/java/org/apache/ranger/audit/producer/kafka/partition/model/UpdatePlugin.java | REST DTO for plugin updates (scale + allowlist mutations). |
| audit-server/audit-ingestor/src/main/java/org/apache/ranger/audit/producer/kafka/partition/model/ServiceAllowlistEntry.java | Plan DTO for per-repo allowlists with optional plugin ownership. |
| audit-server/audit-ingestor/src/main/java/org/apache/ranger/audit/producer/kafka/partition/model/PluginPartitionAssignment.java | DTO for explicit/contiguous partition assignments. |
| audit-server/audit-ingestor/src/main/java/org/apache/ranger/audit/producer/kafka/partition/model/PartitionPlan.java | Versioned plan DTO with JSON serialization/deserialization + validation. |
| audit-server/audit-ingestor/src/main/java/org/apache/ranger/audit/producer/kafka/partition/model/OnboardPlugin.java | REST DTO for onboarding a plugin (mandatory services). |
| audit-server/audit-ingestor/src/main/java/org/apache/ranger/audit/producer/kafka/partition/KafkaPartitionPlanRegistry.java | Kafka implementation of the compacted plan registry. |
| audit-server/audit-ingestor/src/main/java/org/apache/ranger/audit/producer/kafka/partition/KafkaAuditTopicPartitionGrower.java | Grows audit topic partitions before plans reference new tail IDs. |
| audit-server/audit-ingestor/src/main/java/org/apache/ranger/audit/producer/kafka/partition/exception/PartitionPlanException.java | Base exception for plan validation and mutation errors. |
| audit-server/audit-ingestor/src/main/java/org/apache/ranger/audit/producer/kafka/partition/exception/PartitionPlanConflictException.java | Optimistic-lock conflict exception carrying the current plan (HTTP 409). |
| audit-server/audit-ingestor/src/main/java/org/apache/ranger/audit/producer/kafka/partition/constants/PartitionPlanConstants.java | Constants for initial plan version and consumer group ids. |
| audit-server/audit-ingestor/src/main/java/org/apache/ranger/audit/producer/kafka/partition/AuthToLocalRuleComposer.java | Composes and applies auth_to_local rules based on allowlist union in dynamic mode. |
| audit-server/audit-ingestor/src/main/java/org/apache/ranger/audit/producer/kafka/partition/AuthToLocalRuleCatalog.java | Parses the auth_to_local catalog and composes a reduced active ruleset. |
| audit-server/audit-ingestor/src/main/java/org/apache/ranger/audit/producer/kafka/AuditPartitioner.java | Adds dynamic plan routing path using PartitionPlanHolder. |
| audit-server/audit-ingestor/src/main/java/org/apache/ranger/audit/producer/kafka/AuditMessageQueue.java | Starts/stops PartitionPlanWatcher when dynamic mode is enabled. |
| audit-server/audit-common/src/test/java/org/apache/ranger/audit/utils/AuditMessageQueueUtilsTest.java | Adds tests for building Kafka AdminClient config. |
| audit-server/audit-common/src/main/java/org/apache/ranger/audit/utils/AuditMessageQueueUtils.java | Adds plan-topic creation, topic-exists probing, admin config helper, and topic grow helper. |
| audit-server/audit-common/src/main/java/org/apache/ranger/audit/server/AuditServerConstants.java | Adds dynamic partition-plan constants and changes default configured plugins to empty. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
… code Use Math.floorMod for buffer hash routing, align PartitionPlanHolder Javadoc with validator rules, and update configured.plugins REST doc. Co-authored-by: Cursor <cursoragent@cursor.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What changes were proposed in this pull request?
Implements RANGER-5655: a dynamic unified ingestor registry for Ranger audit-ingestor so operators can change Kafka partition routing and per-repo service allowlists at runtime — without restarting ingestor pods.
The registry is a versioned JSON document in Kafka topic
ranger_audit_partition_plan(1 partition, compacted). All ingestor replicas converge viaPartitionPlanWatcher;AuditPartitionerroutes on the hot path from in-memory state only.Feature flag (default off):
ranger.audit.ingestor.kafka.partition.plan.dynamic.enabled=falseProblem
ranger.audit.ingestor.service.*.allowed.usersin site XML at startupkafka.configured.plugins+ per-plugin overrides at startupSolution (this PR update)
Simplified REST control plane — three endpoints only:
GET/api/audit/partition-planplugins,buffer,services,version)POST/api/audit/partition-plan/pluginsservicesmapPATCH/api/audit/partition-plan/plugins/{pluginId}addServices/updateServices/removeServicesRemoved (consolidated above):
PATCH /api/audit/partition-plan,POST /api/audit/partition-plan/services, separate promote-only / scale-only flows.New request models:
OnboardPlugin,UpdatePlugin. Service entries stored with optionalpluginIdfor repo→plugin ownership.Code changes in this commit (REST simplification slice)
AuditREST.javaPartitionPlanService.javaonboardPlugin(),updatePlugin()PartitionPlanAllocator.javaPartitionPlanRequestValidator.javaserviceson POST onboardOnboardPlugin.java,UpdatePlugin.javaServiceAllowlistEntry.javapluginIdfor ownershipPartitionPlanRequestValidatorTest+ mutation/allocator updates (94 partition-plan tests)How was this patch tested?
Unit tests + quality gates
mvn verify -pl audit-server/audit-ingestor -Drat.skip=true \ -Dtest='PartitionPlan*Test,ServiceAllowlist*Test,AuthToLocalRuleComposerTest'Focused run:
Manual testing (local Docker audit lab)
Manual validation used a local Docker Compose audit environment that mirrors a production-style Ranger audit deployment: Kerberos (KDC + plugin keytabs), Kafka with both the audit data topic (
ranger_audits) and the compacted registry topic (ranger_audit_partition_plan), a running audit-ingestor instance on port 7081, Solr (with audit dispatcher), Postgres-backed Ranger Admin, and real plugin containers for HDFS and Hive. All partition-plan REST calls used SPNEGO (Kerberos) as the ingestor HTTP service principal; plugin audit posts used each plugin’s own keytab.The ingestor was rebuilt with this branch’s code (including mandatory
servicesvalidation on onboard) before running the scenarios below.1. Environment readiness
Before exercising the new API, the lab was brought to a healthy state: ingestor health endpoint returned 200, Kafka was reachable, the plan watcher was active after enabling dynamic mode, and
GET /api/audit/partition-planreturned a coherent plan JSON (version,plugins,buffer,services,topicPartitionCountmatching the liveranger_auditspartition count).2. Static mode unchanged (feature flag off)
With
ranger.audit.ingestor.kafka.partition.plan.dynamic.enabled=false(default):GET /api/audit/partition-planreturned 503 — partition-plan admin API correctly disabled.GET /api/audit/healthstill returned 200.This confirms existing deployments are unaffected when the flag stays off.
3. Enabling dynamic mode and reading the registry
Dynamic mode was turned on (
dynamic.enabled=true) with a fresh or reset plan topic where appropriate. After ingestor restart:ranger_audit_partition_planwith one partition and compacted cleanup policy.GET /api/audit/partition-planreturned 200 with version ≥ 1, populatedservicesfrom XML bootstrap, andtopicPartitionCountequal tokafka-topics --describe ranger_audits.4. Simplified REST API — onboard, validation, scale
All mutations used
expectedVersionfrom the precedingGET.Negative validation (new behavior)
POST /api/audit/partition-plan/pluginswithpluginId,partitionCount, andexpectedVersionbut omittingservices→ 400 Bad Request with message indicating services are required. This was the primary regression guard for the API consolidation.Successful onboard
stormorambari) in a single call with a non-emptyservicesmap (repo →allowedUsers). Response 200; plan version incremented; plugin appeared underpluginswith dedicated partition IDs taken from the buffer (or tail-grown when needed); corresponding repo entries appeared underservices.Multi-repo onboard in one version bump
trinowith two repos in one POST (dev_trinoanddev_trino2, each with its ownallowedUsers) → 200; both repos present inserviceswithpluginIdownership tagged totrino.Optimistic locking
expectedVersion→ 409 Conflict with current plan in the response body.hdfsagain when it already had dedicated partitions → 400 (conflicting state).Scale after onboard
PATCH /api/audit/partition-plan/plugins/{pluginId}withadditionalPartitions→ 200; tail partition IDs appended append-only;ranger_auditsgrown via AdminClient when required; subsequentGETshowed stable version and layout.Idempotency check
GET /api/audit/partition-planwithout restart showed the same version and layout as the last successful write.5. End-to-end plugin flows (allowlist + routing)
These tests prove the full path: registry onboard → allowlist enforcement → Kafka produce → correct partition assignment.
HDFS
hdfswith repodev_hdfsand allowlisthdfs,nnviaPOST .../plugins(mandatoryservices).POST /api/audit/access?serviceName=dev_hdfs&appId=hdfsusing the hdfs Kerberos principal → 200;authenticatedUsermapped to short namehdfs.ranger_auditsand verified the partition number was in thehdfsassignment list from the plan (not the buffer pool).hdfswithPATCH .../plugins/hdfsand repeated the access + Kafka partition check — routing still respected the updated plan.Hive
hiveServer2with repodev_hiveand allowlist["hive"]in the same onboard POST.[7, 8]after prior lab mutations).HDFS already onboarded path
hdfswas already present in the plan from an earlier run, the lab skipped re-onboard and verified allowlist + routing still held: access accepted, partition ∈ plan.6. Allowlist behavior (authorization layer)
Separate from partition routing:
services[repo].allowedUsers(afterauth_to_local) → 200 on/access.PATCH .../plugins/{pluginId}withupdateServicesto remove the principal → 403 on the same POST.This confirms the unified
servicesmap in the registry drives authorization without XML restart.7. What did not change
ranger_auditsgrows.8. Summary of manual test outcomes
services→ 400services